package com.mybatis.code.gen.util;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.mybatis.code.gen.api.CodeDbConfig;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: liuby5
 * @CreateTime: 2023-05-16  10:03
 * @Description:
 * @Version: 1.0
 */
@Slf4j
public class CodeGenUtils {
    public static void codeGen(CodeDbConfig dataSource) {
        // 配置数据源
        DataSourceConfig.Builder dataBuilder = new DataSourceConfig.Builder(dataSource.getUrl() + "/" + dataSource.getDbName(), dataSource.getUserName(), dataSource.getPassWord());
        log.info("设置数据库连接为:{}",dataSource.getUrl() + "/" + dataSource.getDbName());
        // 获取当前项目地址
        String directPath = System.getProperty("user.dir");
        log.info("当前项目工程路径为:{}",directPath);
        // 生成的表
        log.info("当前要生成的表为:{}",dataSource.getTableName());
        // 生成
        FastAutoGenerator.create(dataBuilder)
                .globalConfig(builder -> {
                    builder.author("2685476375") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir(directPath+ "/code-gen/src/main/java"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.mybatis.code.gen") // 设置父包名
                            .moduleName("generator") // 设置父包模块名
                            .entity("entity")
                            .service("service") // service包名
                            .serviceImpl("service.impl") // serviceImpl 报名
                            .mapper("mapper") // mapper 包名
                            .xml("mapper.xml") // xml包名
                            .pathInfo(Collections.singletonMap(OutputFile.xml,  directPath+"/code-gen" + "/src/main/resources/mapper")); // 设置mapperXml生成路径
                })
                // 设置模板引擎
                .templateEngine(new FreemarkerTemplateEngine())
                // 自定义模板
                .templateConfig(config->{
                    config.entity("/templates/entity.java")
                            .controller("/templates/controller.java")
                            .xml("/templates/xml.java")
                            .mapper("/templates/mapper.java");
//                            .service("/templates/service.java")
//                            .serviceImpl("/templates/serviceImpl.java");
                })
                // 自定义文件内容
                .strategyConfig(builder -> {
                    builder.addInclude(dataSource.getTableName()) // 设置需要生成的表名
                            .entityBuilder().enableFileOverride()
                            .mapperBuilder().enableFileOverride()
                            .controllerBuilder().enableFileOverride()
                            .serviceBuilder().enableFileOverride().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImp");
                })
                .execute();
    }
}
